package com.muse.sentinel.demo1;

import com.alibaba.csp.sentinel.SphO;
import com.alibaba.csp.sentinel.Tracer;

import lombok.extern.slf4j.Slf4j;

/**
 * SphO.entry时，是否被限流/熔断，是通过boolean来判断的。
 *
 * @author: muse
 * @create: 2021-08-19 10:56
 **/
@Slf4j
public class SentinelSphOSimpleDemo {

    public static void main(String[] args) {
        runFlowRules();
        // runDegradeRules();
    }

    /**
     * 限流规则
     */
    public static void runFlowRules() {
        RulesUtils.initFlowRules(); /** 初始化限流规则 */
        int i = 0;
        while (i < RulesUtils.MAX_NUM) {
            if (SphO.entry(RulesUtils.FLOW_RULES_RESOURCES)) { /** 没有限流，会走如下代码 */
                try {
                    BusinessService.process();
                } catch (Throwable e) {
                    log.error("业务逻辑异常");
                } finally {
                    SphO.exit();
                }
            } else { /** 限流后，会走如下代码 */
                log.error("请求被SphO限流——block!");
            }
            i++;
        }
    }

    /**
     * 熔断规则
     */
    public static void runDegradeRules() {
        RulesUtils.initDegradeRule(); /** 初始化熔断规则 */
        int i = 0;
        while (i < RulesUtils.MIN_NUM) {
            if (SphO.entry(RulesUtils.DEGRADERULES_RULES_RESOURCES)) { /** 没有熔断，会走如下代码 */
                try {
                    BusinessService.processError();
                } catch (Throwable t) {
                    log.error("业务逻辑异常");
                    Tracer.trace(t);
               } finally {
                    SphO.exit();
               }
            } else { /** 熔断后，会走如下代码 */
                log.error("请求被SphO熔断——block!");
            }
            i++;
        }
    }

}
